#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys
import os
import traceback
import shutil
from tkgui import main

def ensure_resources():
    """确保必要的资源文件和目录存在"""
    # 确保data目录存在
    if not os.path.exists('data'):
        os.makedirs('data')
    
    # 确保resources目录存在
    if not os.path.exists('resources'):
        os.makedirs('resources')
    
    # 检查haarcascade文件是否存在
    cascade_file = os.path.join('resources', 'haarcascade_frontalface_default.xml')
    if not os.path.exists(cascade_file):
        print(f"警告: 未找到级联分类器文件 {cascade_file}")
        print("您可能需要从OpenCV的GitHub库下载该文件: ")
        print("https://github.com/opencv/opencv/blob/master/data/haarcascades/haarcascade_frontalface_default.xml")
        
        # 尝试从OpenCV安装目录复制文件
        try:
            import cv2
            opencv_cascade = os.path.join(cv2.data.haarcascades, 'haarcascade_frontalface_default.xml')
            if os.path.exists(opencv_cascade):
                shutil.copy(opencv_cascade, cascade_file)
                print(f"已自动从OpenCV复制级联分类器文件到 {cascade_file}")
        except Exception as e:
            print(f"自动复制级联分类器文件失败: {str(e)}")
    
    # 检查LBP级联分类器
    lbp_cascade_file = os.path.join('resources', 'lbpcascade_frontalface.xml')
    if not os.path.exists(lbp_cascade_file):
        try:
            import cv2
            opencv_lbp = os.path.join(cv2.data.haarcascades, 'lbpcascade_frontalface.xml')
            if os.path.exists(opencv_lbp):
                shutil.copy(opencv_lbp, lbp_cascade_file)
                print(f"已自动从OpenCV复制LBP级联分类器文件到 {lbp_cascade_file}")
        except Exception as e:
            print(f"自动复制LBP级联分类器文件失败: {str(e)}")
    
    # 检查中文字体文件
    font_file = os.path.join('resources', 'simhei.ttf')
    if not os.path.exists(font_file):
        # 尝试从Windows系统目录复制黑体字体
        try:
            windows_font = os.path.join(os.environ.get('WINDIR', ''), 'Fonts', 'simhei.ttf')
            if os.path.exists(windows_font):
                shutil.copy(windows_font, font_file)
                print(f"已从系统复制黑体字体到 {font_file}")
            else:
                print("未找到系统黑体字体，中文显示可能会有问题")
        except Exception as e:
            print(f"复制字体文件失败: {str(e)}")

def clean_inconsistent_data():
    """清理不一致的数据（当users.json为空但仍有人脸模型数据时）"""
    import json
    import os
    import pickle
    
    # 检查用户数据文件
    users_file = os.path.join('data', 'users.json')
    face_labels_file = os.path.join('data', 'face_labels.pkl')
    
    if not os.path.exists(users_file) or not os.path.exists(face_labels_file):
        return
    
    # 读取用户数据
    try:
        with open(users_file, 'r', encoding='utf-8') as f:
            users_data = json.load(f)
        
        # 读取人脸标签数据
        with open(face_labels_file, 'rb') as f:
            face_labels = pickle.load(f)
        
        # 如果用户数据为空但人脸标签不为空，则清空人脸标签
        if len(users_data) == 0 and len(face_labels) > 0:
            print("检测到不一致数据: 用户数据为空但人脸模型不为空，正在清理...")
            # 清空人脸标签数据
            with open(face_labels_file, 'wb') as f:
                pickle.dump({}, f)
            print("数据清理完成!")
    except Exception as e:
        print(f"清理数据时出错: {str(e)}")

if __name__ == "__main__":
    try:
        # 确保必要的资源文件和目录存在
        ensure_resources()
        
        # 清理不一致的数据
        clean_inconsistent_data()
        
        # 启动主程序
        print("正在启动人脸识别签到系统...")
        main()
    except Exception as e:
        print(f"程序运行出错: {str(e)}")
        traceback.print_exc()
        input("按Enter键退出...")
        sys.exit(1)